package reflect02;

import org.junit.Test;
import reflect01.Person;

import java.lang.reflect.Field;

/**
 * 反射(解剖出)字段
 * Class类中的成员方法:
 *    Field getField(String name)
 *           返回一个 Field 对象，它反映此 Class 对象所表示的类或接口的指定public修饰的成员字段。
 *     Field getDeclaredField(String name)
 *           返回一个 Field 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明字段
 * Field类中的成员方法:
 *  Object get(Object obj)
 *           返回指定对象上此 Field 表示的字段的值。
 */
public class ReflectDemo02 {
    /*@Test
    public void testMethod01() throws Exception {
        //1.获取Person类的字节码对象
        Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");
        // 2.获取字段信息
        Field f = pCls.getField("name");
        System.out.println(f);
        // 3.获取该字段值
        Person p = pCls.newInstance(); // 相当于Person p = new Person()
        System.out.println(f.get(p)); // 由于成员变量随着对象的存在而存在，所以必须指定获取哪个对象的成员变量的值
        // null


    }*/
    @Test
    public void testMethod02() throws Exception {
        //1.获取Person类的字节码对象
        Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");

        //2.利用getDeclaredField方法获取非public修饰的字段
        Field age = pCls.getDeclaredField("age");

        //3.通过setAccessiable设置java的访问权限检查
        age.setAccessible(true);

        //4.获取当前field字段的值
        Person p = pCls.newInstance();// 相当于Person p = new Person()
        System.out.println(age.get(p));   // 13

        //5.设置当前field字段的值
        age.set(p,28);

        //6.获取当前的值
        System.out.println(age.get(p)); // 28

    }
}
